Generally software application diagnostics tools for production or operations environments provide initial identification of problems. Often when identified, problems are escalated to an application development team for further analysis and in order to be fixed. Typically, when a problem is escalated to developers it may be very helpful to have to be provided focused and detailed recorded information that is specifically relevant to the problem. Such information may shorten the time is takes to find and fix the problem's root cause. Often such details include: the amount of time spent in a given method or subroutine, the arguments received by the method or subroutine, the value or data, if any, returned from the method of subroutine, any exceptions or errors thrown or generated by the method or subroutine, any method or subroutine specific data (e.g. internal variables, global variables, etc.), or application specific information (e.g., Structured Query Language (SQL) queries related to a specific invocation of a database query, hypertext transport protocol (HTPP) header information for networking subroutines, etc.), etc.
Often in order to provide detailed data as described above, data must be collected during the method or subroutine execution on the user-thread, thus causing considerable overhead on the server or executing computer during subroutine execution. Generally, it is desirable for any processes running on server's request-handling threads to be as efficient as possible. This is often highly important in production environments, where latency increase is a real problem. Specifically, collection of method data (e.g. method arguments, return types, thrown exceptions, entry/exit times, etc.) may involve invocation of expensive procedures.
Further, it is often necessary to alter the source code of a subroutine or method prior to compilation in order to allow for collection of the data described above. In addition, due to the desire to reduce latency or, more generally the use of system resources (e.g., processor cycles, memory usage, network bandwidth, etc.) any processing of the collected subroutine data is often done after the execution of the subroutine or software application as a whole.